|
Date : 9 juin 1991 Protection : DISQUETTE CLEF Programme : DICK TRACY Outils : SOFT-ICE, SOURCER, QUAID, MASM, EXE2BIN. Fichier : n�ant Temps pass� : 12 Heures Soci�t� : TITUS Divers : Cr�ation du fichier FRED.COM Origine : MICHOU Num�ro : 086 Une protection disquette 3.5" 720k en piste 4F ( 80 ). L'auteur de la protection a beaucoup d'humour puisque dans tout les secteurs de la piste 79 on peut lire des choses interessantes, voir ci-dessous. Et de toute �vidence la protection se trouve dans la piste 79 secteur 247 !!! Cylinder 79, Side 0, Sector 247: 0000 A001prot by Eric CAEN (c) Titus 1990...Hackers, I hate you !!!!N 0040 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 0080 NNNNNNNNNNNNNNNNNNNNNNNNN_ 000? 00c0 (hh @ @ S 0100 (hh~TYX] \ [X \ H XZY\ H \ H [[Y[ HH@ 0140 Cylinder 79, Side 0, Sector 10: 0000 Sector number J Hackers are women !!! 0040 0080 00c0 0100 0140 Je commence � lan�er QUAID pour voir sur quelle interruption je peux me placer avec SOFT-ICE. Le message WRONG DISK est affich� � l'aide de l'INT 21 fonction 09. Je place donc SOFT-ICE sur cette interruption et d�s qu'il s'affiche je dessassemble en arri�re pour voir ce qui le fait passer par l�. Ceci n'est pas toujours possible. Et effectivement le programme va tester 3 fois la disquette par un CALL puis fait un test pour finalement afficher le message et se bloquer. En forcant le saut apr�s l'un des CALL le soft fonctionne. C'est presque trop beau. Et effectivement c'est trop beau car d'une part cette chaine est comme de bien entendu introuvable et d'autre part tout les fichiers except� le LOADER "loaddick.com" sont crypt�s. La routine qui teste la protection de la disquette est la suivante: E83100 CALL 00B1 --> PREMIER TEST 7325 JAE 00A7 --> SI OK ON SAUTE APRES L'INT 21 E82C00 CALL 00B1 --> SECOND TEST 7320 JAE 00A7 --> SI OK SAUT APRES L'INT 21 . . . INT 21 AH=09 ---> AFFICHAGE MESSAGE D'ERREUR . INT 21 AH=4C ---> TERMINATE PROCESS Il suffit de transformer un des 73 en EB ( JMP ). En essayant de savoir d'ou vient mon 73 je remonte 3 niveaux en arri�re pour me retrouver dans le programme de LOADDICK.COM Ce fichier LOADDICK.COM est un d�compacteur qui charge soit EGA.SQZ ou bien CGA.SQZ. Il va de soit que la moindre modification dans EGA.SQZ fait tout planter. J'ai bien sur trouv� la chaine dans laquelle se trouve mon 73, celui-ci modifi� en EB plante le programme. Chaine dans EGA.SQZ: 73806E807D804F point� par DS:1DA. La modification faite au moment ou le programme LOADDICK a fini de charger EGA.SQZ et passe la main � celui-ci ne fonctionne pas plus. Le seul moment ou cel� fonctionne c'est au retour de l'INT 40 avant que le soft ne teste le FLAG CARRY. Autant dire qu'il n'y a pratiquement plus de solution. Il en reste pourtant une ( et il y en a toujours une il suffit simplement de la trouver et de vouloir y consacrer suffisament de temps pour la mettre au point, c'est d'ailleurs sur ce dernier point que compte les auteurs de protections en tout genre puisque la volont� de craquer un logiciel est inversement proportionnelle au temps qu'on met pour trouver la parade. Donc je pense que le d�tournement de l'INT 40 ou l'INT 21 pour faire mon patch ne devrait pas poser trop de probl�me, de plus c'est un exercice de haute voltige car il va falloir jouer avec le pointeur de pile. ( c'est ce que je d�teste le plus...) Je d�cide de laisser de cot� l'INT 21 car cette derni�re est appel�e un nombre incalculables de fois par le programme pour jeter mon d�volu sur l'INT 40. Le sch�ma directeur en est le suivant: Faire un petit morceau de code qui redirige l'INT 40 sur une routine personnelle qui effectuera le patch puis executera l'INT 40 normalement. Ce petit morceau de code devra �tre lancer avant le jeu lui-m�me et rester r�sident. Autrement dit il faut �crire un petit programme TSR. Le listing ci-dessous est suffisement comment� sans n�cessiter d'explications compl�mentaires. code segment org 100h assume cs:code start: jmp installe cr equ 0dh lf equ 0ah adr_ip equ 0071h patch equ 0EBh ; jmp � mettre � la place de JAE ( 73 ) _off equ 2ah ; SP + 2a = 0FBA ---> adr de CS:0071 initprog db cr,lf db ' Si Disque Dur OK sinon utiliser la disquette copi�e ' db 'avec COPY BOARD',cr,lf,'$' instok db cr,lf,' See you soon FREDDY_SOFT',cr,lf,'$' int40 label dword ;sauvegarde des adresses SEG:OFF de l'INT40 i40off db 0,0 ;d'origine. i40seg db 0,0 flag db 0,0 ;Si le patch est fait on saute la routine. tsrint40 proc far ; point d'entr� de mon INT40 modifi� sti nop push ds ; on sauve tout les registres. push es push di push si push dx push cx push bx push ax cmp byte ptr [flag],1h ; On regarde si c'est fait... jz suite ; Si c'est d�j� fait on continu... mov ax,sp ; SP est envoy� dans AX. increm: pop ds ; On commence par la position actuelle de SP. cmp byte ptr ds:[adr_ip],73h ; Et on compare l'octet en ; DS:[adr_ip] � 73. ( CS:IP ) jnz increm ; On teste la position SP+2 ( puisque l'on a POP� ) mov byte ptr ds:[adr_ip],patch ; Si �gale � 73 on y met EB. mov byte ptr [flag],1h ; On met le drapeau. mov sp,ax ; On remet le pointeur d'origine. suite: pop ax ; Et on restaure les registres... pop bx pop cx pop dx pop si pop di pop es pop ds pushf cli call int40 ; appel de l'INT40 officielle. ret 2 ; et on revient tsrint40 endp eor: ; ROUTINE D'INSTALLATION EN RESIDENT DU CODE CI-DESSUS. installe: mov ax,cs ; CS --> DS mov ds,ax mov dx,offset initprog ; message de debut mov ah,09h int 21h mov ax,3540h ; on detourne l'int 40h int 21h ; sous-fonction 35 mov word ptr [i40off],bx mov i40seg,es mov ax,2540h ; et on met l'ad. du resident mov dx,offset tsrint40 ; sous-fonction 25 int 21h mov dx,offset instok ; message de fin mov ah,09h int 21h mov dx,eor-start+100h+15 ; A voir.... mov cl,4 shr dx,cl mov al,0 mov ah,31h ; sortie et reservation int 21h ; de la memoire code ends end start Voil� et cel� fonctionne parfaitement ( test� sur un 386 et deux 286 ) du moment que le jeu est install� sur disque dur, par contre sur disquette cel� se plante mais ce ne doit pas �tre grand chose. ( revoir la recherche de l'octet, ou bien changer d'IT ) FREDDY |